package com.example.springboot.context;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.context.annotation.Configuration;

/**
 * beanFactory的扩展接口，调用时机在spring在读取beanDefinition信息之后，实例化bean之前。
 * <p> 可以修改 注册的 BeanDefinition 的元信息，或者给 BeanFactory 添加一些自定义的处理逻辑。
 * <p> 1. 修改 BeanDefinition 的属性 : 比如修改 scope、lazy-init、autowire 模式等;
 * <p> 2. 注册自定义的 BeanPostProcessor : (AOP)beanFactory.addBeanPostProcessor ;
 * <p> 3. 验证某些 Bean 是否存在 , 或统一调整某些 Bean 的初始化方法 ;
 * <p> 4. 访问环境信息 :  可以结合 Environment，按条件调整 Bean 的定义 ;
 * <p>
 * <p> 在这里： 不能新注册 BeanDefinition; 不能直接用 Bean 实例（还没创建）
 * <p>
 *
 * @author Zhang.Z
 * @version 2025-09-21
 * @see Test2BeanDefinitionRegistryPostProcessor
 */
@Configuration
public class Test3BeanFactoryPostProcessor implements BeanFactoryPostProcessor {

    /**
     * 修改 BeanDefinition 的属性
     */
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        System.out.println("test3 bean factory");

        /**
         * BeanDefinition bd = beanFactory.getBeanDefinition("myService");
         * bd.setScope(BeanDefinition.SCOPE_PROTOTYPE);
         */
    }
}
